package com.demarc.pesquisas.negocio.entidade;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Embeddable;

import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.hibernate.annotations.Parameter;
import org.hibernate.annotations.Type;
import org.hibernate.validator.constraints.NotBlank;

import com.demarc.pesquisas.infraestrutura.hibernate.type.HibernateTypes;

@Embeddable
public class Endereco implements Serializable {

    private String localidade;
    private TipoLocalidadeEnum tipoLocalidade;
    private String rua;
    private String bairro;
    private String cidade;
    private EstadoEnum estado;;
    private Integer numero;
    private String complemento;
    private String cep;

    public Endereco() {
        // Construtor default.
    }

    public Endereco(EstadoEnum estado, String cidade) {
        this.estado = estado;
        this.cidade = cidade;
    }

    @NotBlank
    public String getLocalidade() {
        return localidade;
    }

    public void setLocalidade(String localidade) {
        this.localidade = localidade;
    }

    @Type(type = HibernateTypes.ENUM_CODIGO_STRING_USER_TYPE, parameters = {@Parameter(name = HibernateTypes.ENUM_CLASS, value = TipoLocalidadeEnum.CLASS_NAME)})
    @Column(name = "tipoLocalidade")
    public TipoLocalidadeEnum getTipoLocalidade() {
        return tipoLocalidade;
    }

    public void setTipoLocalidade(TipoLocalidadeEnum tipoLocalidade) {
        this.tipoLocalidade = tipoLocalidade;
    }

    public String getRua() {
        return rua;
    }

    public void setRua(String rua) {
        this.rua = rua;
    }

    public String getBairro() {
        return bairro;
    }

    public void setBairro(String bairro) {
        this.bairro = bairro;
    }

    public String getCidade() {
        return cidade;
    }

    public void setCidade(String cidade) {
        this.cidade = cidade;
    }

    @Type(type = HibernateTypes.ENUM_CODIGO_STRING_USER_TYPE, parameters = {@Parameter(name = HibernateTypes.ENUM_CLASS, value = EstadoEnum.CLASS_NAME)})
    @Column(name = "estado")
    public EstadoEnum getEstado() {
        return estado;
    }

    public void setEstado(EstadoEnum estado) {
        this.estado = estado;
    }

    public Integer getNumero() {
        return numero;
    }

    public void setNumero(Integer numero) {
        this.numero = numero;
    }

    public String getComplemento() {
        return complemento;
    }

    public void setComplemento(String complemento) {
        this.complemento = complemento;
    }

    public String getCep() {
        return cep;
    }

    public void setCep(String cep) {
        this.cep = cep;
    }

    @Override
    public int hashCode() {
        return new HashCodeBuilder().append(this.estado).append(this.cidade).append(this.bairro)
                .append(this.rua).append(this.numero).toHashCode();
    }

    @Override
    public boolean equals(Object obj) {
        boolean isEquals = false;

        if (obj == this) {
            isEquals = true;
        } else if (obj instanceof Endereco) {
            Endereco endereco = (Endereco) obj;
            isEquals =
                    new EqualsBuilder().append(this.estado, endereco.getEstado())
                            .append(this.cidade, endereco.getCidade())
                            .append(this.bairro, endereco.getBairro())
                            .append(this.rua, endereco.getRua())
                            .append(this.numero, endereco.getNumero()).isEquals();
        }
        return isEquals;
    }
}
